Copyright □ 1999, by Professor Jong-Hwan Kim, Korea Advanced Institute of Science and Technology (KAIST).  All rights reserved. Reproduction or translation of any part of this work is unlawful. Request for permission or further information should be addressed to Professor Jong-Hwan Kim at <johkim@vivaldi.kaist.ac.kr> or <Tel: +82-42-869-3448>.

Prof. Jong-Hwan Kim	Intelligent Control Lab, KAIST

12.로봇 제어 프로그램 ⅤI

로봇 축구는 로봇 한 대가 축구를 하는 것이 아니라 세대의 로봇이 축구를 하므로 로봇간의 역할 지정과 바꿈, 그리고 로봇간의 협력은 매우 중요하다. 이를 바탕으로 상대팀을 고려한 로봇축구 전략을 짤 수 있다.

12.1 전략

로봇 축구에서 협력작업을 위한 알고리즘은 로봇 축구의 성능을 크게 좌우한다. 여러 대의 로봇이 골을 많이 넣게 하는 것은 한 대의 로봇을  이용하여 하는 것과는 상당히 다르며 기술적으로도 많은 어려움이 따른다. 하드웨어적인 성능에 의해서 경기 결과가 크게 좌우되겠지만 결국에는 소프트웨어 알고리즘의 우수성에 의해 승부가 결정 나게 될 것이다. 따라서 축구를 하기 위한 로봇간의 상호 작용과 의사 결정에 대한 알고리즘 개발은 매우 중요하다.

12.1.1 일반적인 전략 설계 방법론

경기를 이기기 위한 것이 전략 수립의 목적으로 이를 위한 다양한 방법을 고려해볼 수 있다. 공격 지향적이 되어서 골을 먹더라도 공을 상대편보다 많이 넣어서 이기려는 전략이 있을 수 있고, 수비위주의 전략으로 될 수 있는 한 수비에 치중하다 결정적인 공격의 기회를 살려 경기를 이기는 전략도 있으며, 공격수와 수비수로 나눈 기본 형태를 구성해서 하는 등의 여러 전략이 있을 것이다.

경기를 하는 데 있어 이러한 여러 전략들은 개인 전술과 팀 전술인 두 가지 형태의 전술들에 기초하여 이루어질 것이다. 물론 로봇 축구에서도 각각의 로봇들이 하드웨어적으로 잘 설계되어 견고하고 빠르게 움직일 수 있고, 이를 운용할 소프트웨어가 준비되어 있다면 개인기는 마련되어 있다고 볼 수 있고, 이들을 효율적으로 협동시켜나갈 팀 전술이 필요하다고 할 수 있다.

12.1.2 개인 전술

기본적으로 골키퍼를 제외한 모든 로봇들은 비슷한 행동을 하도록 만들어져 있다. 각 로봇은 공의 위치가 알려진 경우 골을 넣기 위해 서로 골을 잡고 드리블하고 슛하려는 행동을 할 것이다. 그러므로 같은 팀의 로봇들은 공의 위치가 알려진 순간 서로 공을 잡으려는 경쟁적인 행동을 하게 될 것이다. 기본적으로 축구 로봇을 제어하는데 있어서 필요한 사항은 이동, 장애물 회피, 막기, 슛일 것이다. 이동이나 장애물 회피 같은 행동은 기존에 알려진 방법에 의해 쉽게 구현될 수 있는 것들이며, 또한  막기, 슛과 같은 행동도 하드웨어 특성에 맞게 구현될 수 있다. 이러한 행동들의 적절한 조합에 의해 다양한 축구 로봇의 기술들이 구현될 수 있다. 즉, 이동과 장애물 회피는 드리블에 이용될 수 있으며, 슛 동작은 패스에 이용될 수 있을 것이다.

각 축구 로봇들은 어떤 로봇이라도 위에 언급한 행동들을 할 수 있어야 하므로 모든 로봇에 위의 행동들이 구현되어 있어야 한다. 그러므로 주어진 정보와 환경이 같다면 각 로봇은 같은 행동을 하게 될 것이고 이것은 결국 경쟁을 일으키게 될 것이다.  이 경쟁을 해결하는 방법으로서 공에 접근하는데 제일 적합한 로봇을 결정해주는 방법이 있을 것이다. 공을 잡는 로봇을 결정하는 가장 쉬운 방법은 로봇에서 공까지의 거리가 제일 가깝고, 공과의 방향각이 제일 작고, 공까지로 지나가는 길에 상대팀 로봇이 가로 놓여있지 않을 경우 이 로봇을 선택하는 것이다. 이 결정은 공까지와 거리와 가로막는 로봇의 수 사이에 적당한 가중치를 설정함으로써 변하게 될 것이고, 이 변수는 경기에 있어 승리를 위해 최적으로 결정되거나 학습으로 조종되어야 할 것이다.

개인 전술에서 협력의 목적은 로봇간의 불필요한 경쟁을 없앰으로써 원하는 바를 더 수월히 이루는 것이다.  공격시에는 각 로봇들은 골을 넣기 위해서 팀 구성원을 서로 도와줘야 하고, 수비시에는 골을 막기 위해 서로 협조해야 할 것이다. 공격시, 일단 팀이 공을 가지게 되면, 공을 가진 로봇은 골을 향하여 킥을 하거나 드리블을 하게 될 것이다. 팀의 다른 로봇은 골을 넣는 것을 돕기 위해 공격선상에서 비켜있어야 한다. 즉, 상대편의 로봇이 공격선상에 오는 것을 막거나 그 자신이 그 선상에서 비켜나야 한다. 수비시에는, 상대팀의 로봇이 공을 가지게 되면 각 로봇들은 그들 자신들을 골로 향하는 공의 진행 방향 앞에, 또는 상대편 공격 선상에 위치시킴으로써 수비를 할 것이다. 그러나 그 공격선상에 멀리 떨어져 있으면 자기자신으로부터 제일 가까운 상대 로봇에 가서 그 로봇이 골대로 가는 진로를 막는 수비형태를 취해야 할 것이다. 이러한 개인 전술은 묵시적으로 이루어지는 행동들로 다른 로봇과의 통신이 이루어지지 않는 상황하에서 발생하는 것들이다. 이러한 행동들은 사전에 주 컴퓨터에 프포그램된 명령에 따라서 나오게 된다.

12.1.3 팀 전술

공격시 상대팀 수비 때문에 공을 드리블이나 킥을 할 수 없는 경우, 또는 진로가 막힌 경우 그 공을 자기편 로봇에게 패스를 할 수 있어야 한다. 이를 위하여 주 컴퓨터는 자기팀 로봇의 위치를 확인한 후 공을 가지고 있는 로봇에게 자기 팀 로봇이 있는 빈 공간 쪽으로 공을 차 주도록 명령을 내린다.

상대 수비 로봇에 의해 패스가 안 되는 경우 드리블을 하여서 패스를 할 수 있는 지역으로 이동해야 할 것이며 이 때 로봇의 이동위치는 시간, 거리, 에너지 등을 고려한 최적이 되어야 할 것이다. 수비하는 로봇 팀의 전술의 경우 공격개념을 수비 개념으로 바꾸면 똑같은 수비 전술을 얻을 수 있다. 이 팀 전술은 개인 전술보다는 더 상위 계층에서 구현될 알고리즘으로 개인 전술의 알고리즘들을 통제할 수 있어야 한다.

12.1.4 기본 전술 대형

그림 12.1 MiroSot에서 사용 될 수 있는 기본 전술 대형: (a) 1-1-1 대형 (b) 1-0-2 대형 (c) 1-2-0 대형 (d) 0-0-3 대형

각 로봇의 개인기와 묵시적인 협력을 통한 개인 전술과 통신을 통한 협력 작업인 팀 전술 외에 기본 전술 대형은 대형을 유지함으로써 협력을 쉽게 구현할 수 있는 한 방법이다. 기본 전술 대형은 팀의 전체적인 성향을 보여주고, 개인 전술과 팀 전술에 비해 이해하기 쉽고 구현하기도 쉽다.

세대 로봇의 기본 대형으로는 (a) 1-1-1 (골키퍼-수비-공격) 대형 (b) 1-0-2 (골키퍼, 좌우 윙) 대형 (c) 1-2-0 (골키퍼, 좌우 윙) 대형 (d) 0-0-3 (전원공격) 대형 등을 생각할 수 있다.

1-1-1 대형은 가장 많이 구현되는 대형으로 골키퍼, 수비, 공격으로 각 로봇이 맡은 임무만 수행함으로써 로봇간의 경쟁을 없애 자연스러운 협력작업을 하게 된다. 1-0-2 대형은 골키퍼, 좌우 윙으로 나누어 윙은 공격과 수비를 동시에 하지만 대신 두 로봇간의 영역을 나누어 둘 사이의 경쟁을 없애는 방법이다.  1-2-0 대형은 1-0-2대형의 변형으로 주로 수비를 위주로 하는 대형이 된다. 0-0-3 대형은 로봇간의 임무를 구별하지 않고 매 순간 상황에 따라 대응하는 대형으로 개인 전술과 팀 전술의 구현이 잘 되어 있어야 한다. 이런 대형은 주로 공격적인 성향을 보이게 된다.

이 외에 많은 전술 대형을 개발할 수 있을 것이다. 이러한 대형들은 개인전술과 팀전술의 적절한 운용을 통해야 효과적으로 이루어질 것이며, 갖가지 상황에 따른 많은 대형 및 전술을 개발해야 될 것이다.

그림 12.2는 두 대의 로봇이 공격을, 한 대는 골키퍼를 하는 경우이다. 이는 두 대의 로봇은 경기장의 좌우에 위치하며 자신의 영역에 공이 오면 공을 차게 하는 지역방어 전술의 일종이다.

그림 12.2 지역전술

이를 프로그램으로 나타내면 다음과 같다.

void Attack(int whichrobot1, int whichrobot2)

{

if(PositionOfBall[0]>150.0 || PositionOfBall[0]<0.0)	// 공이 상대편 또는 자기 골대에 들어갔을 경우

StopRobot();	// 로봇들을 멈춤

if(PositionOfBall[1] > 55.0){	// 공의 Y 좌표가 55cm 보다 큰 경우

Kick(whichrobot1);	// whichrobot1이 공을 찬다.

Position(whichrobot2, PositionOfBall[0]-20.0, 40.0);

// whichrobot2는 공의 뒤쪽에 위치한다.

}

else if(PositionOfBall[1]<75.0){	// 공의 Y 좌표가 75cm 보다 작은 경우

Kick(whichrobot2);	// whichrobot2가 공을 찬다.

Position(whichrobot1, PositionOfBall[0]-20.0, 90.0);

// whichrobot1은 공 뒤쪽에 위치한다.

}

}

여기서 StopRobot 함수는 모든 로봇을 정지시키는 함수로, 로봇들을 정지시키려면 PWM 값으로 127을 주면 된다. 다음은 StopRobot 함수의 프로그램이다. 여기서 command 배열은 통신을 위해 할당된 변수이다.

void StopRobot()

{

command[0] = 0xff;	// 통신 데이터의 초기값

command[1] = 0xff;	// 통신 데이터의 초기값

command[2] = 0xff;	// 통신 데이터의 초기값

command[3] = 0x0f;	// A 팀인 경우 = 0x0f, B 팀인 경우 = 0xf0

command[4] = 0x7f;	// Robot 1의 왼쪽 PWM 값

command[5] = 0x7f;	// Robot 1의 오른쪽 PWM 값

command[6] = 0x7f;	// Robot 2의 왼쪽 PWM 값

command[7] = 0x7f;	// Robot 2의 오른쪽 PWM 값

command[8] = 0x7f;	// Robot 3의 왼쪽 PWM 값

command[9] = 0x7f;	// Robot 3의 오른쪽 PWM 값

m_pComm.WriteCommBlock((LPSTR)command, 10);	// 위의 데이터를 직렬포트를 통해 보냄

}

이상으로 전략 및 전술에 대하여 설명하였다. 여기서 보인 프로그램들은 기본적인 예제로 실제 시합에 이기려면 다른 점들을 더 고려하여 프로그래밍하여야 할 것이다.